package dodizhu2;

import java.util.*;

/**
 * Date: 2023-04-24
 * Time: 17:51
 */
public class pokerGame {

    // 牌盒
    static ArrayList<String> list = new ArrayList<>();

    static HashMap<String,Integer> map = new HashMap<>();

    static {
        // 准备牌
        String[] color = {"♥","♠","♣","♦"};
        String[] number = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        for(String s:color){
            for(String n:number){
                list.add(s+n);
            }
        }
        list.add(" 小王");
        list.add(" 大王");

        // 指定牌的价值
        // 拿着数字到map集合中进行寻找
        // 判断是否存在,如果存在,获取价值
        // 不存在,牌本身的数字就是价值
        map.put("J",11);
        map.put("Q",12);
        map.put("K",13);
        map.put("A",14);
        map.put("2",15);
        map.put("小王",16);
        map.put("大王",17);
    }







    public pokerGame(){
        // 洗牌
        Collections.shuffle(list);

        // 发牌
        ArrayList<String> poker1 = new ArrayList<>();
        ArrayList<String> poker2 = new ArrayList<>();
        ArrayList<String> poker3 = new ArrayList<>();
        ArrayList<String> poker = new ArrayList<>();


        for (int i = 0; i < list.size(); i++) {
            if(i<3){
                // 添加底牌
                poker.add(list.get(i));
                continue;
            }

            if(i%3==0){
                poker1.add(list.get(i));
            } else if (i%3==1) {
                poker2.add(list.get(i));
            }else{
                poker3.add(list.get(i));
            }
        }


        // 排序 -- 利用价值进行排序
        order(poker);
        order(poker1);
        order(poker2);
        order(poker3);

        // 看牌
        lookPoker("底牌",poker);
        lookPoker("刚脑壳",poker1);
        lookPoker("大帅比",poker2);
        lookPoker("饭桶",poker3);


    }



    // 利用牌的价值进行排序
    // 参数: 集合
    // ♥5 ♥3 ♥5 ♥7 ♥9
    public void order(ArrayList<String> list){
        Collections.sort(list, new Comparator<String>() {
            // Array (插入排序+二分查找)
            @Override
            public int compare(String o1, String o2) {
                // o1 表示要插入1有序序列中的牌
                // o2 表示已经在有序序列中的牌

                // 负数 o1小 插入到前面
                // 正数 o2大 插入到后面
                // 0 o1和o2大小相等,按照花色进行排序

                //计算o1的花色和价值
                String color1 = o1.substring(0,1);
                int value1 = getValue(o1);

                //计算o2的花色和价值
                String color2 = o1.substring(0,1);
                int value2 = getValue(o2);

                // 比较o1和o2的价值
                int i = value1-value2;
                return i==0?color1.compareTo(color2):i;
            }
        });

    }

    // 计算牌的价值
    // 参数 牌
    // 返回值 整数
    public int getValue(String poker){
        String number = poker.substring(1);

        if(map.containsKey(number)){
            // 存在,获取价值
            return map.get(number);
        }else{
            // 不存在,强转
            return Integer.parseInt(number);
        }
    }

    public void lookPoker(String name, ArrayList<String> ts){
        System.out.print(name+" ");
        for(String poker:ts){
            System.out.print(poker+" ");
        }
        System.out.println();
        
    }
}
